package com.mycode.command15;

import com.mycode.command15.resolve.*;
import com.mycode.command15.resolve2.AddCommand;
import com.mycode.command15.resolve2.CalculatorForm;
import com.mycode.command15.resolve3.Command;

/**
 * 命令模式：将一个请求封装为一个对象，从而可用不同的请求对客户进行参数化，对请求排队或者记录请求日志，以及支持可撤销的操作。
 * 命令模式：可以将请求发送者与接收者解耦，请求发送者通过命令对象来简介引用请求接收者，使得系统具有更好的灵活性和可扩展性
 * 主要优点：
 *     1、降低系统的耦合度
 *     2、增加新的命令可以很容易地加入到系统中
 *     3、容易设计一个命令队列或宏命令（组合命令）
 *     4、为请求的撤销和恢复操作提供了一种设计和实现方案
 * 主要缺点：
 *     可能会导致使用系统有过多的具体命令类，
 * 适用场景：
 *     1、系统需要将请求调用者和请求接收者解耦，使得调用者和接收者不直接交互
 *     2、系统需要在不同时间执行请求，将请求排队和执行请求
 *     3、系统需要支持命令的撤销操作和恢复操作
 *     4、系统需要将一组操作组合在一起形成宏命令
 *
 */
public class Bootstrap {

    public static void main(String[] args) {
        // resolve();

        CalculatorForm form = new CalculatorForm();
        AddCommand addCommand = new AddCommand();
        form.setCommand(addCommand);

        form.compute(10);
        form.compute(5);
        form.compute(8);
        form.undo();
        form.undo();


    }

    private static void resolve() {
        FBSettingWindow fbSettingWindow = new FBSettingWindow("功能键设置：");

        FunctionButton functionButton1 = new FunctionButton("功能键1");
        FunctionButton functionButton2 = new FunctionButton("功能键2");

        // 创建具体的命令类
        com.mycode.command15.resolve.Command minimizeCommand = new MinimizeCommand();
        com.mycode.command15.resolve.Command helpCommand = new HelpCommand();

        // 将命令对象注入功能键
        functionButton1.setCommand(minimizeCommand);
        functionButton2.setCommand(helpCommand);

        fbSettingWindow.addFunctionButton(functionButton1);
        fbSettingWindow.addFunctionButton(functionButton2);
        fbSettingWindow.display();

        // 调用功能键的业务方法
        functionButton1.onClick();
        functionButton2.onClick();
    }

}
